/*f
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Bruno
 */
public class JogadorDAO implements DAO<Integer, Jogador> {

    public void salva(Jogador obj) {
        //Pessoa pessoa = (Pessoa) obj;               


        // ResultSet rs = CRUD.consulta("select max(idpessoa) from pessoa");

        int i = SeqHelper.getId("pessoa");
        String st = (obj.getSituacao() == null) ? "null, " : "" + obj.getSituacao().getIdSituacao() + "";
        String time = (obj.getTime() == null) ? "null, " : "" + obj.getTime().getIdTime() + "";
        CRUD.adiciona("pessoa", "idPessoa, "+ obj.getFieldsToInsertAsString(),  i + ", " + obj.getFieldContentToInsertAsString());                            
        CRUD.adiciona("Jogador", "NROCAMISA, POSICAOJOGADOR,IDSITUACAO,IDPESSOA, IDTIME", obj.getNroCamisa() + ",'" + obj.getPosicaoJogador() + "' , " + st + "," + i + "," + time);
        obj.setIdPessoa(i);

    }

    public void atualiza(Jogador obj) {
        List<String> c = new ArrayList<String>();
        // c.add("IDJogador");
        c.add("nomepessoa");
        c.add("datanascpessoa");
        c.add("salariopessoa");
        c.add("dataadmissao");

        List<String> a = new ArrayList<String>();
        a.add("'" + obj.getNomePessoa() + "'");
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        a.add("'" + sdf.format(obj.getDataAdmissao()) + "'");
        a.add(String.valueOf(obj.getSalarioPessoa()));
        a.add("'" + sdf.format(obj.getDataNascPessoa()) + "'");
        CRUD.atualiza("pessoa", c, a, " where idpessoa = " + obj.getIdPessoa());

        c.clear();
        a.clear();
        c.add("NROCAMISA");
        c.add("POSICAOJOGADOR");
        c.add("IDSITUACAO");
        c.add("IDPESSOA");
        c.add("IDTIME");

        a.add(String.valueOf(obj.getNroCamisa()));
        a.add("'" + obj.getPosicaoJogador() + "'");
        a.add(String.valueOf(obj.getSituacao().getIdSituacao()));
        a.add(String.valueOf(obj.getIdPessoa()));
        a.add(String.valueOf(obj.getTime().getIdTime()));
        CRUD.atualiza("Jogador", c, a, " where IDpessoa = " + obj.getIdPessoa());

    }

    public void deleta(Integer obj) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(obj);
        String campo = "idpessoa";
        CRUD.deleta("Jogador", campo, list);
        CRUD.deleta("Pessoa", campo, list);
    }

    public Jogador recupera(Integer obj) {
        try {
            ResultSet rs = CRUD.consulta("select p.idpessoa as pessoa, * from pessoa p, Jogador where pessoa.idpessoa = jogador.idpessoa and idpessoa = " + obj);

            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> situacaoAux = new TreeSet<Integer>();

            Collection<Jogador> jogadores = new ArrayList<Jogador>();
            Jogador j = null;
            while (rs.next()) {
                j = new Jogador();
                j.setIdPessoa(rs.getInt("pessoa"));
                j.setNomePessoa(rs.getString("NOMEPESSOA"));
                j.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                j.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                j.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                j.setIdTime(rs.getInt("IDTIME"));
                j.setNroCamisa(rs.getInt("NROCAMISA"));;
                j.setPosicaoJogador(rs.getString("POSICAOJOGADOR"));
                j.setIdSituacao(rs.getInt("IDSITUACAO"));
                situacaoAux.add(j.getSituacao().getIdSituacao());
                timesAux.add(j.getTime().getIdTime());
                jogadores.add(j);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<SituacaoJogador> situacao = new SituacaoJogadorDAO().recuperaLista(situacaoAux);

            preencheRelacionamentos(times, situacao, j);


            return j;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Jogador> recuperaLista(Collection<Integer> chaves) {
        StringBuilder sb = new StringBuilder();
        Iterator<Integer> it = chaves.iterator();
        while (it.hasNext()) {
            sb.append(it.next()).append(",");
        }
        String ids = sb.toString().substring(0, sb.toString().length() - 1);

        try {
            ResultSet rs = CRUD.consulta("select p.idpessoa as pessoa, p.*, j.* from pessoa p, Jogador j where p.idpessoa = j.idpessoa and p.idpessoa in (" + ids + ")");

            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> situacaoAux = new TreeSet<Integer>();
            Collection<Jogador> jogadores = new ArrayList<Jogador>();

            while (rs.next()) {
                Jogador j = new Jogador();
                j.setIdPessoa(rs.getInt("pessoa"));
                j.setNomePessoa(rs.getString("NOMEPESSOA"));
                j.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                j.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                j.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                j.setIdTime(rs.getInt("IDTIME"));
                j.setNroCamisa(rs.getInt("NROCAMISA"));;
                j.setPosicaoJogador(rs.getString("POSICAOJOGADOR"));
                j.setIdSituacao(rs.getInt("IDSITUACAO"));
                situacaoAux.add(j.getIdSituacao());
                timesAux.add(j.getIdTime());
                jogadores.add(j);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<SituacaoJogador> situacao = new SituacaoJogadorDAO().recuperaLista(situacaoAux);

            for (Jogador j : jogadores) {
                preencheRelacionamentos(times, situacao, j);
            }

            return jogadores;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Jogador> recuperaTodos() {

        try {
            ResultSet rs = CRUD.consulta("select * from Jogador");

            Collection<Integer> timesAux = new TreeSet<Integer>();
            Collection<Integer> situacaoAux = new TreeSet<Integer>();
            Collection<Jogador> jogadores = new ArrayList<Jogador>();

            while (rs.next()) {
                Jogador j = new Jogador();
                j.setIdPessoa(rs.getInt("idpessoa"));
                j.setNomePessoa(rs.getString("NOMEPESSOA"));
                j.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                j.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                j.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                j.setIdTime(rs.getInt("IDTIME"));
                j.setNroCamisa(rs.getInt("NROCAMISA"));;
                j.setPosicaoJogador(rs.getString("POSICAOJOGADOR"));
                j.setIdSituacao(rs.getInt("IDSITUACAO"));
                situacaoAux.add(j.getSituacao().getIdSituacao());
                timesAux.add(j.getTime().getIdTime());
                jogadores.add(j);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            Collection<SituacaoJogador> situacao = new SituacaoJogadorDAO().recuperaLista(situacaoAux);

            for (Jogador j : jogadores) {
                preencheRelacionamentos(times, situacao, j);
            }

            return jogadores;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private void preencheRelacionamentos(Collection<Time> times, Collection<SituacaoJogador> sit, Jogador j) {
        Iterator<Time> itTimes = times.iterator();
        while (itTimes.hasNext()) {
            Time corrente = itTimes.next();
            if (j.getIdTime() == corrente.getIdTime()) {
                j.setTime(corrente);
                itTimes.remove();
            }
        }

        Iterator<SituacaoJogador> itSituacao = sit.iterator();
        while (itSituacao.hasNext()) {
            SituacaoJogador corrente = itSituacao.next();
            if (j.getIdSituacao() == corrente.getIdSituacao()) {
                j.setSituacao(corrente);
                itSituacao.remove();
            }
        }

    }
}
